﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GeneralLibs;
using CustomSecurity;
using Lists;
using ListForms;
using BasicForms;
using BarCode;
using System.IO;
using System.IO.Compression;
using System.Diagnostics;
using System.Net;
using System.Net.Cache;
using AutoUpdaterDotNET;
using Ionic.Zip;

namespace Portal
{
    public partial class FrmPortal : BasicForms.FrmBase
    {
        public FrmPortal()
        {
            InitializeComponent();

            try
            {
                #region Load last GUI'state
                if (LocalSettings.HeThong != null)
                {
                    defaultLookAndFeel1.LookAndFeel.SkinName = LocalSettings.HeThong.SkinName;
                }
                #endregion
            }
            catch (Exception ex)
            {
            }

        }

        private void btnBanHangLe_Click(object sender, EventArgs e)
        {
            BanLe.FrmEditHoaDonBanLe frm = new BanLe.FrmEditHoaDonBanLe();
            frm.Show();
        }

        private void btnCauHinh_Click(object sender, EventArgs e)
        {
            FrmCacCauHinh frm = new FrmCacCauHinh();
            frm.Show();
        }

        private void ReIndexDB()
        {
            SqlConnection con = new SqlConnection(GeneralLibs.LocalSettings.ConnectString);
            try
            {
                con.Open();
                SqlCommand cmd = con.CreateCommand();
                cmd.CommandTimeout = 1000 * 10;
                cmd.CommandText = string.Format("DECLARE @MyTable VARCHAR(255) \n" +
                                                "DECLARE myCursor CURSOR FOR \n" +
                                                "   SELECT table_name \n" +
                                                "   FROM information_schema.tables \n" +
                                                "   WHERE table_type = 'base table' \n" +
                                                "OPEN myCursor \n" +
                                                "FETCH NEXT FROM myCursor INTO @MyTable \n" +
                                                "WHILE @@FETCH_STATUS = 0 \n" +
                                                "BEGIN \n" +
                                                "   PRINT 'Reindexing Table:  ' + @MyTable \n" +
                                                "   DBCC DBREINDEX(@MyTable, '', 80) \n" +
                                                "   FETCH NEXT FROM myCursor INTO @MyTable \n" +
                                                "END \n" +
                                                "CLOSE myCursor \n" +
                                                "DEALLOCATE myCursor \n" +
                                                "EXEC sp_updatestats \n"
                                                );
                BasicForms.FrmProgressBar.StartShowProgress("Đang đánh lại chỉ mục cho các bảng trong CSDL để tăng tốc độ truy vấn");
                cmd.ExecuteNonQuery();
                Config.ThoiDiemReIndexGanNhat = new NullableDate(DateTime.Now);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Gặp sự cố khi đánh lại chỉ mục cho các bảng trong CSDL");
            }
            finally
            {
                BasicForms.FrmProgressBar.FinishShowProgress();
                if (con.State == ConnectionState.Open) con.Close();
            }
        }
        private bool CheckConnection()  //Đầu tiên luôn phải check chuỗi kết nối lưu trong LocalSettings.ConnectString, không được thì không mở gì cả
        {
            FrmProgressBar.StartShowProgress();
            bool result = true;

            //Ý tưởng là thử bằng Localsettings trước, nếu k được thì thử file C.dat

            SqlConnection con = new SqlConnection(LocalSettings.ConnectString);
            try
            {
                con.Open(); //Bước 1: kiểm tra Open. Nhưng k có tên CSDL vẫn open được. Check tiếp
                if (LocalSettings.ConnectString.Contains("; DATABASE = ; UID="))  //Tức chưa cấu hình Tên CSDL
                    result = false;
            }
            catch (Exception ex)
            {
                result = false;
            }
            finally
            {
                if (con.State == ConnectionState.Open) con.Close();
                FrmProgressBar.FinishShowProgress();
            }

            if (result == false)
            {
                try
                {
                    //Đọc file C.dat
                    string path = CommonLib.ThuMucGoc + "\\C.dat";
                    string str = LocalSettings.LoadFromFileDATToText(path);

                    string[] thongSo = str.Split('-');

                    if (thongSo.Length == 4)
                    {
                        LocalSettings.HeThong.DB_Server = thongSo[0];
                        LocalSettings.HeThong.DB_Name = thongSo[1];
                        LocalSettings.HeThong.DB_UID = thongSo[2];
                        LocalSettings.HeThong.DB_PASS = thongSo[3];
                        LocalSettings.HeThong.UseExpertMode = false;
                        LocalSettings.HeThong.Save2File();

                        con = new SqlConnection(LocalSettings.ConnectString);
                        try
                        {
                            con.Open(); //Bước 1: kiểm tra Open. Nhưng k có tên CSDL vẫn open được. Check tiếp
                            if (LocalSettings.ConnectString.Contains("; DATABASE = ; UID="))  //Tức chưa cấu hình Tên CSDL
                                result = false;
                        }
                        catch (Exception ex)
                        {
                            result = false;
                        }
                        finally
                        {
                            if (con.State == ConnectionState.Open) con.Close();
                            FrmProgressBar.FinishShowProgress();
                        }
                    }
                }
                catch (Exception ex)
                {
                }
            }

            return result;
        }
        private void FrmPortal_Load(object sender, EventArgs e)
        {
            if (DesignMode) return;

            try
            {
                if (!CheckConnection()) //Không kết nối được thì mở Form cấu hình và return
                {
                    FrmCauHinhCoSoDuLieu frm = new FrmCauHinhCoSoDuLieu();
                    frm.ShowDialog();
                    return;
                }
                else
                {
                    //Kết nối được mà chưa có file C.dat thì tạo 1 lần
                    string path = CommonLib.ThuMucGoc + "\\C.dat";
                    if (!File.Exists(path))
                        LocalSettings.CreateConnectionFile();
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }

            FirstInstall();
            CheckUpdate(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString());

            //2 Ngày reindex 1 lần
            try
            {
                if (Config.ThoiDiemReIndexGanNhat is NullableDate)
                {
                    TimeSpan span = DateTime.Now - (DateTime)Config.ThoiDiemReIndexGanNhat.Date;
                    if (span.TotalDays > 2) ReIndexDB();
                }
                else
                {
                    ReIndexDB();
                    Config.ThoiDiemReIndexGanNhat = new NullableDate(DateTime.Now);
                }
            }
            catch (Exception ex)
            {
            }

            SetGUI();
            try
            {
                //Hiện phiên bản trước để có lỗi thì vẫn nhìn thấy phiên bản
                string version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
                lblVersion.Text = string.Format("Phiên bản: {0} - {1}", version, LocalSettings.HeThong.DB_Name);
                string pathVersionRecorded = CommonLib.ThuMucGoc + "\\LatestVersion.txt";
                if (File.Exists(pathVersionRecorded))
                    File.Delete(pathVersionRecorded);
                System.IO.StreamWriter str = System.IO.File.AppendText(pathVersionRecorded);
                str.WriteLine(version + ".HuyHoang,ThanhVinh,BachKhoa,VietBook,Cpin,Ninh Bình");
                str.Close();

                Lists.ThongTinPhu.PhienBan = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
                Lists.Store store = Lists.DanhMucStore.Instance.GetByStoreID(Config.StoreID);
                //Nếu không có store thì bắt phải nhập. Vì rất nhiều thứ cần dùng.
                if (store == null)
                {
                    FrmWarning.Show("Thông báo", "Phần mềm chưa được cấu hình thông tin cửa hàng (Store). Hãy nhập thông số cửa hàng để phần mềm có thể hoạt động");
                    FrmSetStoreID frm = new FrmSetStoreID();
                    if (frm.ShowDialog() != DialogResult.OK)
                    {
                        FrmWarning.Show("Thông báo", "Phần mềm không thể hoạt động nếu không có cấu hình thông số cửa hàng");
                        Application.Exit();
                        return;
                    }
                }
                //Nếu có thì set Tag để biết là store nào
                store = Lists.DanhMucStore.Instance.GetByStoreID(Config.StoreID);
                this.Tag = "FrmPortal," + store.Ten;

                if (store != null)
                {
                    if (store.Ten.ToUpper().Contains("VIETBOOK"))
                        lblVersion.Text = string.Format("Phiên bản: {0} - {1} - {2}", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version, store.Ten, LocalSettings.HeThong.DB_Name);
                    else
                        lblVersion.Text = string.Format("Phiên bản: {0} - {1}", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version, store.Ten);
                }
                else
                {
                    if (store.Ten.ToUpper().Contains("VIETBOOK"))
                        lblVersion.Text = string.Format("Phiên bản: {0} - {1}", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version, LocalSettings.HeThong.DB_Name);
                    else
                        lblVersion.Text = string.Format("Phiên bản: {0}", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version);
                }

                #region ThietLap DangKy hoac lay ten may
                LocalSettings.HeThong.HardwareID = CommonLib.GetMacAddressID();
                MayTinh mayTinh = DanhMucMayTinh.Instance.GetByHardwareID(LocalSettings.HeThong.HardwareID);
                if (mayTinh == null)
                {
                    mayTinh = DanhMucMayTinh.Instance.NewDoiTuong();
                    mayTinh.HardwareID = LocalSettings.HeThong.HardwareID;
                    mayTinh.Ten = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
                    mayTinh.GenSoMayBaseOnDB();
                    mayTinh.InsertToDB();
                }
                LocalSettings.HeThong.SoMay = mayTinh.GetSoMay();
                GeneralLibs.LocalSettings.HeThong.Save2File();
                #endregion

                if (LocalSettings.HeThong.AutoLogin)
                {
                    User.CurUser = User.Login(LocalSettings.HeThong.TenTruyCap, LocalSettings.HeThong.Password);
                    if (User.CurUser != null)
                    {
                        //this.AccessibleDescription chứa nhóm người dùng,  this.CausesValidation chứa option xóa hàng bán lẻ có cần quét thẻ không.
                        //Dùng truyền thông tin cho CustomGrid
                        if (CustomSecurity.User.CurUser.RoleList.Contains("Admin") || CustomSecurity.User.CurUser.UserName == "SupAdmin")
                        {
                            this.AccessibleDescription = "ADMIN";
                            this.CausesValidation = true;
                        }
                        else
                        {
                            this.AccessibleDescription = "";
                            if (Config.MoXoaHangCanQuetThe == DuocPhepMoXoaHangCanQuetThe.DuocPhep)
                                this.CausesValidation = true;
                            else
                                this.CausesValidation = false;
                        }
                    }
                }
                else
                {
                    LoginLogout();
                }
                SetGUI();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
            try
            {
                //Hàng trả lại sửa đi sửa lại hay bị lỗi tạo thêm phiếu nhập kho mà k có hàng --> method này xóa những phiếu đó đi khi mở phần mềm lên
                Vouchers.ChungTu.XoaPhieuTrangHangTraLai();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }

        private void CheckUpdate(string installedVersion)
        {
            //DownloadFile LatestVersion về xem có phiên bản mới không
            if (Config.LinkAutoUpdate != null)
            {
                string pathLink = CommonLib.ThuMucGoc + "\\LinkAutoUpdate.txt";
                if (File.Exists(pathLink))
                    File.Delete(pathLink);
                System.IO.StreamWriter str = System.IO.File.AppendText(pathLink);
                str.WriteLine(Config.LinkAutoUpdate);
                str.Close();

                WebRequest webRequest = WebRequest.Create(Config.LinkAutoUpdate + "//LatestVersion.txt");
                webRequest.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);

                WebResponse webResponse;

                try
                {
                    webResponse = webRequest.GetResponse();
                }
                catch (Exception)
                {
                    return;
                }

                Stream appCastStream = webResponse.GetResponseStream();
                int maxRead = 10000;
                byte[] buffer = new Byte[maxRead];
                int length = appCastStream.Read(buffer, 0, maxRead);
                string temp = System.Text.UTF8Encoding.UTF8.GetString(buffer);
                string versionInServer = temp.Substring(0, maxRead - length - 1);

                //Check xem phiên bản có khác nhau không
                try
                {
                    if (versionInServer != null)
                    {
                        string[] installedVer = installedVersion.Split('.');
                        string[] verInServer = versionInServer.Split('.');
                        Store store = Lists.DanhMucStore.Instance.GetByStoreID(Config.StoreID);

                        bool storeCondition = false;
                        string[] danhSachKhachDuocCapNhat = verInServer[4].Split(',');
                        foreach (string cuaHang in danhSachKhachDuocCapNhat)
                        {
                            if (store.Ten.ToUpper().Contains(cuaHang.Trim().ToUpper()))
                            {
                                storeCondition = true;
                                break;
                            }
                        }
                        if (Convert.ToInt32(installedVer[3].ToString()) < Convert.ToInt32(verInServer[3].ToString()) &&
                            storeCondition)
                        {
                            //Download chương trình update rồi Mở chương trình Download Update
                            try
                            {
                                var webClient = new WebClient();
                                webClient.DownloadFileCompleted += OnDownloadComplete;

                                //Tắt process nếu có. Đề phòng cho chắc chứ khi update đã gọi tắt 1 lần rồi
                                Process[] runningProcesses = Process.GetProcesses();
                                foreach (Process process in runningProcesses)
                                {
                                    if (process.ProcessName.ToUpper().Contains("AUTOUPDATER.NET"))
                                    {
                                        process.Kill();
                                    }
                                }
                                string link = "";
                                if (Config.LinkAutoUpdate.EndsWith("/"))
                                    link = Config.LinkAutoUpdate.Substring(0, Config.LinkAutoUpdate.Length - 1) + "/AutoUpdater.NET.exe";
                                var uri = new Uri(link);
                                try
                                {
                                    webClient.DownloadFileAsync(uri, CommonLib.ThuMucGoc + "\\AutoUpdater.NET.exe");
                                }
                                catch (Exception ex)
                                {
                                    //BasicForms.FrmExceptionNotifier.ShowAndLog(new Exception(ex.Message + "--" + uri + "--" + CommonLib.ThuMucGoc + " 1"));
                                }

                            }
                            catch (System.Reflection.TargetInvocationException ex)
                            {
                                //MessageBox.Show(ex.Message + " 2");
                            }
                        }
                    }
                }
                catch (Exception)
                {
                }
            }
        }
        private void OnDownloadComplete(object sender, AsyncCompletedEventArgs e)
        {
            System.Diagnostics.Process.Start(CommonLib.ThuMucGoc + "\\AutoUpdater.NET.exe");
        }
        private bool CheckLicence()
        {
            try
            {
                while (true)
                {
                    //Phương làm
                    try
                    {
                        //Vì những ông đã dùng rồi thì không nên check --> dựa vào thời điểm khóa sổ đầu tiên.
                        //Những nơi có thời điểm khóa sổ đầu tiên sau ngày 30/6/2013 đều bị check. trước đó thì bỏ qua.
                        //ThoiDiemKhoaSo thoiDiemKhoaSoDauTien = DanhMucThoiDiemKhoaSo.Instance.GetThoiDiemKhoaSoDauTien();
                        //if (thoiDiemKhoaSoDauTien.ThoiDiem < new DateTime(2013, 7, 1)) return true;

                        if (Config.HanSuDung == "") return false;
                        //Check hạn sử dụng
                        string decryptText = CommonLib.Decrypt(Config.HanSuDung, true);
                        string[] split = decryptText.Split('/');
                        //Cho thêm 1 ngày, tức là quá ngày trong key mới báo lỗi
                        DateTime decryptResult = new DateTime();
                        if (split[2] == "9999")
                            decryptResult = new DateTime(Convert.ToInt32(split[2]), Convert.ToInt32(split[1]), Convert.ToInt32(split[0]));
                        else
                        {
                            decryptResult = new DateTime(Convert.ToInt32(split[2]), Convert.ToInt32(split[1]), Convert.ToInt32(split[0]));
                            decryptResult = decryptResult.AddDays(1);
                        }

                        if (CommonLib.GetSystemDateTime() > decryptResult)
                        {
                            return false;
                        }
                        else
                        {
                            lblHanSuDung.Text = string.Format("Hạn sử dụng: {0}", decryptResult.AddDays(-1));
                            return true;
                            //Khởi động lại phần mềm
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Lỗi khi kiểm tra hạn sử dụng: " + ex.Message);
                        return false;
                    }
                }
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
                return false;
            }
        }
        public void LoginLogout()
        {
            try
            {
                if (User.CurUser == null)//login
                {
                    while (true)
                    {
                        try
                        {
                            FrmLogin frmLogin = new FrmLogin();
                            if (frmLogin.ShowDialog() == DialogResult.OK)
                            {
                                SqlConnection con = new SqlConnection(LocalSettings.ConnectString);
                                try
                                {
                                    con.Open();
                                }
                                catch (Exception ex)
                                {
                                    MessageBox.Show("Không thể kết nối đến cơ sở dữ liệu", "Lỗi đăng nhập");
                                }

                                Lists.Store store = Lists.DanhMucStore.Instance.GetByStoreID(Config.StoreID);
                                if (store != null) lblVersion.Text = string.Format("Phiên bản: {0} - {1}", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version, store.Ten);
                                else lblVersion.Text = string.Format("Phiên bản: {0}", System.Reflection.Assembly.GetExecutingAssembly().GetName().Version);

                                try
                                {
                                    User.CurUser = User.Login(frmLogin.UserName, frmLogin.Password);
                                    if (User.CurUser != null)
                                    {
                                        //this.AccessibleDescription chứa nhóm người dùng,  this.CausesValidation chứa option xóa hàng bán lẻ có cần quét thẻ không.
                                        //Dùng truyền thông tin cho CustomGrid
                                        if (CustomSecurity.User.CurUser.RoleList.Contains("Admin") || CustomSecurity.User.CurUser.UserName == "SupAdmin")
                                        {
                                            this.AccessibleDescription = "ADMIN";
                                            this.CausesValidation = true;
                                        }
                                        else
                                        {
                                            this.AccessibleDescription = "";
                                            if (Config.MoXoaHangCanQuetThe == DuocPhepMoXoaHangCanQuetThe.DuocPhep)
                                                this.CausesValidation = true;
                                            else
                                                this.CausesValidation = false;
                                        }

                                        break;
                                    }
                                }
                                catch (Exception ex)
                                {
                                    MessageBox.Show(ex.Message, "Lỗi đăng nhập");
                                }
                            }
                            else
                            {
                                break;
                            }
                        }
                        catch (Exception loginEx)
                        {
                            MessageBox.Show(loginEx.Message, "Lỗi đăng nhập");
                        }
                    }
                    //if (!CheckLicence()) return;
                }
                else//logout
                {
                    while (Application.OpenForms.Count > 1)
                    {
                        foreach (Form form in Application.OpenForms)
                        {
                            if (form != this)
                            {
                                form.Close();
                                break;
                            }
                        }
                    }
                    User.CurUser = null;
                    this.AccessibleDescription = "";
                }
                SetGUI();
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
            }
        }
        private void SetGUI()
        {
            if (User.CurUser != null)
            {
                btnHeThong.Visible = false;
                btnMaVach.Enabled = true;
                btnBanLe.Enabled = true;
                btnKinhDoanh.Enabled = true;
                lblDangNhap.Text = "Đăng xuất";
            }
            else
            {
                btnHeThong.Visible = true;
                btnHeThong.Enabled = false;
                btnMaVach.Enabled = false;
                btnBanLe.Enabled = false;
                btnKinhDoanh.Enabled = false;
                lblDangNhap.Text = "Đăng nhập";
            }
        }

        private void FirstInstall()
        {

            //Khi cài đặt phần mềm, bộ cài sẽ tạo ra 1 file tên: "" trong thư mục cài đặt.
            //Nếu lần đầu mở phần mềm sau khi cài đặt --> hỏi xem có tạo tự động CSDL k.
            //Dù có hay k thì cũng xóa file này đi. Từ các lần sau check k thấy file thì k hỏi nữa.
            string path = string.Format("{0}\\First.srmdep", Application.StartupPath);
            if (File.Exists(path) &&
                MessageBox.Show("Phần mềm mới được cài đặt.\nBạn có muốn tạo CSDL mới?", "Thông tin cài đặt lần đầu", MessageBoxButtons.YesNo,
                MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes) //Tồn tại file này và đồng ý tạo mới CSDL
            {
                //Tạo CSDL tự động
                FrmCreateDatabase frm = new FrmCreateDatabase();
                frm.ShowDialog();

                File.Delete(path); //Xong thì kiểu gì cũng xóa để lần sau k hỏi lại
            }
            else
            {
                SqlConnection con = new SqlConnection(LocalSettings.ConnectString);
                try
                {
                    con.Open();

                    //Mở được kết nối mới xét tiếp
                    //Hết hạn sử dụng vẫn cho dùng nhưng hiển thị thông báo 1 tiếng phút 1 lần
                    if (!CheckLicence())
                    {
                        timerHanSuDung.Enabled = true;
                        timerHanSuDung.Interval = 3600000;
                        timerHanSuDung.Start();
                        try
                        {
                            MessageBox.Show("Phần mềm đã hết hạn sử dụng.\nBạn cần nhập key mới.");
                            OpenFileDialog openFileDialog = new OpenFileDialog();
                            openFileDialog.Filter = "DAT file|*.license;*.LICENSE";
                            if (openFileDialog.ShowDialog() == DialogResult.OK)
                            {
                                string pathSource = openFileDialog.FileName;
                                string resultText = LocalSettings.LoadFromFileDATToText(pathSource);
                                if (resultText != "")
                                {
                                    //Nếu mà key và storename hợp lệ thì check
                                    Lists.Store store = Lists.DanhMucStore.Instance.GetByStoreID(Config.StoreID);
                                    string decryptText = CommonLib.Decrypt(resultText, true);
                                    string[] split = decryptText.Split('/');
                                    if (store.Ten.ToUpper().Contains(split[3].ToUpper()) || split[3].ToUpper() == "SRMDEP")
                                    {
                                        Config.HanSuDung = resultText;
                                        MessageBox.Show(string.Format("Phần mềm đã được gia hạn đến: {0}/{1}/{2}", split[0], split[1], split[2]));
                                        //Xóa luôn nội dung file
                                        try
                                        {
                                            LocalSettings.EncryptTextToLicenseFile(pathSource, "");
                                        }
                                        catch (Exception exx)
                                        {
                                            File.Delete(pathSource);
                                        }
                                        MessageBox.Show("Phần mềm sẽ phải khởi động lại.");
                                        Application.Restart();
                                        this.Close();
                                    }
                                    else
                                    {
                                        MessageBox.Show("Key không phù hợp với CSDL. Phần mềm chưa được gia hạn");
                                    }
                                }
                                else
                                {
                                    MessageBox.Show("Key này đã được sử dụng.");
                                }
                            }
                            else
                            {
                                MessageBox.Show("Bạn chưa gia hạn sử dụng phần mềm. Hãy liên hệ với nơi mua hàng để được gia hạn.");
                            }
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show("Lỗi khi nhập key: " + ex.Message);
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Không thể kết nối đến cơ sở dữ liệu", "Lỗi đăng nhập");
                    FrmCauHinhCoSoDuLieu frm = new FrmCauHinhCoSoDuLieu();
                    if (frm.ShowDialog() != System.Windows.Forms.DialogResult.OK)
                    {
                        Application.Exit();
                    }
                }
            }
        }

        private void ReadListDBToLocalSettings()
        {
            int counter = 0;
            LocalSettings.ListDatabaseInServer.Clear();

            try
            {
                //Đọc từ bảng store, có id = -1 là các CSDL cần insert trùng danh mục
                Store store = DanhMucStore.Instance.GetDanhSachCSDL();
                if (store == null || store.Ten == "") return;

                string[] listDB = store.Ten.Split('#');
                foreach (string item in listDB)
                {
                    if (item.Trim() != "") LocalSettings.ListDatabaseInServer.Add(item.Trim());
                    counter++;
                }
            }
            catch (Exception ex)
            {
                LocalSettings.ListDatabaseInServer.Clear();
                counter = 0;
            }
        }

        private void timerHanSuDung_Tick(object sender, EventArgs e)
        {
            MessageBox.Show("Bạn chưa gia hạn sử dụng phần mềm. Hãy liên hệ với nơi mua hàng để được gia hạn.");
        }

        private void EncryptFile()
        {
            OpenFileDialog openFile = new OpenFileDialog();
            openFile.ShowDialog();
            if (openFile.FileNames.Length > 0)
            {
                foreach (string filename in openFile.FileNames)
                {
                    LocalSettings.EncryptTextFromOneFileToDATFile(filename, "BlanhDB_SQL");
                }
            }
        }

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            try
            {
                switch (keyData)
                {
                    case Keys.F1:
                        GeneralLibs.CommonLib.ShowHelp(this.Name);
                        break;

                    case Keys.Control | Keys.L:
                    case Keys.Control | Keys.D:
                        LoginLogout();
                        break;

                    //Some hide functions
                    case Keys.Control | Keys.Shift | Keys.Alt | Keys.C:
                        FrmCauHinhCoSoDuLieu frmCauHinhCoSoDuLieu = new FrmCauHinhCoSoDuLieu();
                        frmCauHinhCoSoDuLieu.Show();
                        break;
                    case Keys.Control | Keys.Shift | Keys.Alt | Keys.A:
                        FrmEditThongSoAnChoDeveloper frm = new FrmEditThongSoAnChoDeveloper();
                        frm.Show();
                        break;
                    case Keys.Control | Keys.Shift | Keys.Alt | Keys.E:
                        EncryptFile();
                        break;
                }
                return base.ProcessCmdKey(ref msg, keyData);
            }
            catch (Exception ex)
            {
                BasicForms.FrmExceptionNotifier.ShowAndLog(ex);
                return false;
            }
        }

        private void btnMaVach_Click(object sender, EventArgs e)
        {
            FrmBarCode frm = new FrmBarCode();
            frm.Show();
        }

        private void btnBanLe_Click(object sender, EventArgs e)
        {
            try
            {
                if (ModifierKeys == Keys.Control)
                {
                    Right right = User.CurUser.GetRight("FrmDanhSachHoaDonBanLe");
                    if (right == CustomSecurity.Right.None) return;

                    BasicForms.FrmProgressBar.StartShowProgress();

                    BanLe.FrmDanhSachHoaDonBanLe frm = new BanLe.FrmDanhSachHoaDonBanLe();
                    frm.Show();
                }
                else
                {
                    Right right = User.CurUser.GetRight(btnBanLe.Tag.ToString());
                    if (right == CustomSecurity.Right.None) return;

                    BasicForms.FrmProgressBar.StartShowProgress();

                    BanLe.FrmEditHoaDonBanLe frm = new BanLe.FrmEditHoaDonBanLe();
                    frm.Show();
                }
            }
            catch (Exception ex)
            {
            }
            BasicForms.FrmProgressBar.FinishShowProgress();
        }

        private void btnKinhDoanh_Click(object sender, EventArgs e)
        {
            try
            {
                BasicForms.FrmProgressBar.StartShowProgress();
                FrmKinhDoanh frm = new FrmKinhDoanh();
                frm.Show();

                ReadListDBToLocalSettings();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                BasicForms.FrmProgressBar.FinishShowProgress();
            }
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnConfigDatabase_Click(object sender, EventArgs e)
        {

        }

        private void lblDangNhap_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            LoginLogout();

            if (BasicForms.FrmProgressBar.ShowProgressBar) BasicForms.FrmProgressBar.FinishShowProgress();
        }

        private void FrmPortal_FormClosed(object sender, FormClosedEventArgs e)
        {
            LocalSettings.HeThong.TenTruyCapHienTai = "";
            LocalSettings.HeThong.PasswordHienTai = "";
            LocalSettings.HeThong.Save2File();
        }

    }
}
